import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
rgb_image = cv.imread('image.png')
# OpenCV使用BGR格式而不是RGB
bgr_image = cv.cvtColor(rgb_image, cv.COLOR_RGB2BGR)
# 转换为HSV
hsv_image = cv.cvtColor(bgr_image, cv.COLOR_BGR2HSV)

# 定义绿色的HSV范围
# 注意：这些值可能需要根据图像进行调整
lower_green = np.array([40, 50, 50])  # 色调范围，饱和度，明度
upper_green = np.array([84, 230, 200])
# 创建一个绿色植被的二值化掩码
binary = cv.inRange(hsv_image, lower_green, upper_green)

# 定义结构元素（通常是一个小的矩形或椭圆形）
# 结构元素的大小取决于你想要影响的图像细节的大小
kernel1 = np.ones((1, 1), np.uint8)  # 你可以根据需要调整这个大小
# 应用开运算
# 开运算 = 腐蚀 + 膨胀
opening = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel1)

kernel2 = np.ones((5, 5), np.uint8)
# 应用闭运算
# 闭运算 = 膨胀 + 腐蚀
closing = cv.morphologyEx(opening, cv.MORPH_CLOSE, kernel2)

# 反二值化处理，即将二值图像中的白色变为黑色，黑色变为白色
# 通过简单的位运算实现：255 - binary（因为255是白色，0是黑色）
inverted_binary = 255 - closing

# 定义ROI的边界
height, width = inverted_binary.shape
roi_height = int(height * 0.1)
roi_width = int(width * 0.7)
roi_start_x = int(width * (1 - 0.7) // 2)
roi_start_y = int(height - roi_height)
last_x = 0
last_y = 0
# 截取ROI
rois = []
centers = []
matrixs = []
for i in range(10):
    if i >= 3:
        break
    for_x = roi_start_x
    for_y = height - int(height * (i + 1) // 10)
    roi = inverted_binary[for_y:for_y + roi_height, for_x:for_x + roi_width]
    # cv.imshow('closing', roi)
    cv.waitKey(0)
    cv.destroyAllWindows()
    # 提取轮廓
    contours, _ = cv.findContours(roi, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    # 提取并标记中心特征点
    for contour in contours:
        # 计算边界框并找到中心点
        x, y, w, h = cv.boundingRect(contour)
        if w * h < 530:
            continue
        center = ((int((x + x + w) / 2) + for_x), (int((y + y + h) / 2) + for_y))  # 注意这里是一个简化的中心点计算方法
        center_x, center_y = center
        # print(x, y)
        centers.append(center)
        if center_x < 60 or center_x > 200:
            del centers[-1]
            continue
        # 在原图上画出中心点（如果需要）
        cv.circle(rgb_image, center, 2, (0, 0, 255), -1)
    matrixs.append(centers)
    centers = []
    # print(matrixs)
    rois.append(roi)
transposed_matrix = [[row[i] for row in matrixs] for i in range(len(matrixs[0]))]
for matrix in transposed_matrix:
    cv.line(rgb_image, matrix[0], matrix[1], (0, 0, 255), 2)
    cv.line(rgb_image, matrix[1], matrix[2], (0, 0, 255), 2)

# 显示结果
cv.imshow('Original Image', rgb_image)
# cv.imshow('closing', roi)

# 等待按键然后关闭窗口
cv.waitKey(0)
cv.destroyAllWindows()
